<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="google-site-verification" content="yaeorbXgKPwp5BDegBtAJEHYWFEFE-BViWTj74gJPrw" />
<!--  -->
<link href="/css/default.css" type="text/css" rel="stylesheet" />
<!--  -->
<script type="text/javascript" src="/js/jquery.js"></script>
<script type="text/javascript" src="/lang/en.js"></script>
<script type="text/javascript" src="/js/mac/core.min.js"></script>
<title>mac-flow 示例与流程编辑器</title>
<meta name="description" content="java 流程引擎" />
<meta name="keywords" content="java flow 流程引擎" />
<script type="text/javascript">
$(function(){
	function adjust(){
		var de = document.documentElement
			, ch = de.clientHeight, cw = de.clientWidth;
		$('#body').width(cw - 16);
	}
	$(window).resize(adjust);
	adjust();
});
</script>
</head>
<body>
<div id="head">
	<a href="/en/"><img src="/css/images/logo_s.png" alt="logo" /></a>
	<div class="title">BOARSOFT.COM</div>
	<div class="right">
		<div>
			<a href="/public/lang.php?l=en">English</a>
			|
			<a href="/public/lang.php?l=cn">简体中文</a>
			|
			<a href="http://activemq.apache.org/" target="_blank">ActiveMQ</a>
			|
			<a href="https://redis.io/" target="_blank">Redis</a>
			|
			<a href="http://www.jquery.com/" target="_blank">JQuery</a>
		</div>
	</div>
</div><div id="body">
	<div class="dir">
<h1>目录</h1>
<hr/>
<ul>
	<li><a href="/en/mac/flow/index.html">基本概念</a></li>
	<li><a href="/en/mac/flow/config.html">基本配置</a></li>
	<li><a href="/en/mac/flow/demo/index.html#">用法示例（含编辑器用法）</a><li>
	<ul>
		<li><a href="/en/mac/flow/demo/index.html#svc">创建服务</a></li>
		<li><a href="/en/mac/flow/demo/index.html">基本示例</a></li>
		<li><a href="/en/mac/flow/demo/index.html#params">属性配置</a></li>
		<li><a href="/en/mac/flow/demo/index.html#wrapper">包装器</a></li>
		<li><a href="/en/mac/flow/demo/index.html#judge">判定节点</a></li>
		<li><a href="/en/mac/flow/demo/index.html#subflow">流程引用</a></li>
		<li><a href="/en/mac/flow/demo/index.html#while">循环</a></li>
		<li><a href="/en/mac/flow/demo/index.html#fork">并行与异步</a></li>
		<li><a href="/en/mac/flow/demo/index.html#tx">事务处理</a></li>
		<li><a href="/en/mac/flow/demo/index.html#com">创建组件</a></li>
	</ul>
	<li><a href="/en/mac/flow/advance.html">进阶应用</a><li>
	<ul>
		<li><a href="/en/mac/flow/advance.html#persist">持久化</a></li>
		<li><a href="/en/mac/flow/advance.html#xml">自定义生成器</a></li>
		<li><a href="/en/mac/flow/advance.html#threadpool">自定义线程池</a></li>
		<li><a href="/en/mac/flow/advance.html#batch">开发批量</a></li>
		<li><a href="/en/mac/flow/advance.html#mapping">自定义参数映射</a></li>
		<li><a href="/en/mac/flow/advance.html#trace">调用链跟踪</a></li>
	</ul>
	<li><a href="/en/mac/flow/qa.html">Question and Answer</a></li>
</ul>	</div>
	<div class="main">
		<div id="nav">
			<div id="nav_path">
				<a href="/en/">Home</a>
				&gt;
				<a href="/en/mac/flow">mac-flow</a>
				&gt;
				示例
			</div>
			<div id="nav_back">
				<a href="javascript:history.back()">Back</a>
				|
				<a href="/en/">UP</a> &nbsp;&nbsp;
			</div>
			<div class="clear"></div>
		</div>
<h1>mac-flow 示例与流程编辑器</h1>
点击下载&nbsp;<a href="/mac/flow/dl/mac-flow-demo.rar">流程应用示例</a>
｜
<a href="/mac/flow/dl/mac_flow_editor.rar">简化版流程编辑器</a>
｜
<a href="/en/download.html#jar">依赖JAR包与源码下载</a>
<h2><a name="svc"></a>创建服务</h2>
&nbsp;&nbsp;点击“服务管理”，“添加”，添加成功后，即可在表格上点击“编辑流程”开始编辑
<p><img alt="图片未能加载" src="/mac/flow/img/svc.png" /></p>
<h2><a name="editor"></a>开始编辑</h2>
&nbsp;&nbsp;下图是一个简单的流程图：
<p><img alt="create service" src="/mac/flow/img/overview.png" /></p>
&nbsp;&nbsp;操作方式与要点：
<ul>
	<li>放置节点方式一：从右侧“节点元素”标签页拖拽想要的节点到中间的绘图区</li>
	<li>放置节点方式二：在右侧“节点元素”标签页选中想要的节点，再到中间的绘图区点击鼠标右键即可放置。</li>
	<li>绘制箭头的方法：假设需要绘制箭头连接AB两个节点，需先在右侧“节点元素”标签页“单击”箭头，然后再将鼠标移动到A节点上（该节点的矩形区域内），按下鼠标左键不放，移动鼠标到B节点上后松开。</li>
	<li>右侧的属性面板上的下拉框，除了可以用鼠标点选外，均可以使用“回车”加“上下”键来选取。输入关键字并回车可过滤选项。</li>
	<li>一般情况下接口不需要填写</li>
	<li>“实现类”和“包装器”可以直接输入而不需要“选取”，但可以针对接口保存已有的实现类和包装器以便复用</li>
</ul>
&nbsp;&nbsp;点击编辑器右上角的菜单按钮，可以生成XML
<h2><a name="params"></a>属性配置</h2>
&nbsp;&nbsp;选中某个节点，在其“接口配置”中填写“实现类”作为这个节点的handler，然后点击“属性配置”为这个handler注入必要属性：
<p><img alt="图片未能加载" src="/mac/flow/img/prop.png" /></p>
<p><img alt="图片未能加载" src="/mac/flow/img/pmap.png" /></p>
&nbsp;&nbsp;注：如果想引用一个现有的bean，需要上图中“类型”一列填“ref”，“值”一列填被引用的bean的ID
<h2><a name="wrapper"></a>包装器</h2>
&nbsp;&nbsp;节点的包装器配置用于在调用当前节点的Handler之前和之后进行一些处理，比如参数转换，原理如下：
<p><img alt="图片未能加载" src="/mac/flow/img/wrap.png" /></p>
&nbsp;&nbsp;在选中某个支持包装器的节点，在“高级选项”中填现“包装器”。
<p><img alt="图片未能加载" src="/mac/flow/img/wrapper.png" /></p>
&nbsp;&nbsp;注：在编写通用的参数映射包装器时，往往需要配置数据之是如何映射，点击“参数映射”来完成此动作。如果默认的配置方式不能解决问题，可以通过二次开发来定制。
<h2><a name="judge"></a>判定节点与多路分支节点</h2>
&nbsp;&nbsp;判定节点和多路分支节点都支持MVEL表达式和注入Handler这两种实现方法，如果如果有注入handler则直接调用，否则将解析配置的表达式。
<h2><a name="subflow"></a>流程引用</h2>
&nbsp;&nbsp;新创建的服务将被作为组件放到组件库，在流程编辑器的左侧的“组件库”标签页可以找到，拖动一个组件到绘图区即可。被引用的流程将显示一个子流程节点（subflow）<br/>
&nbsp;&nbsp;选中某个子流程节点，在右侧“基础属性”区可以找到“转到子流程”的链接，方便转去编辑子流程。
<h2><a name="while"></a>循环与递归</h2>
&nbsp;&nbsp;mac-flow天然支持循环，无需专门的处理，非常自然，递归同理。参见<a href="./make.html">makeMoney</a>示例
<h2><a name="fork"></a>并行与异步</h2>
&nbsp;&nbsp;fork分为两种形式，一种是以固定的分支并行（参见<a href="./accq.html">account query</a>示例），另一种是动态的分支并行（参见<a href="./make.html">make money</a>示例）。前者多用于联机交易，后者多用于批量应用。<br/>
&nbsp;&nbsp;fork/join是实现异步的一种形式，也可以自行使用Future模式来实现。更多的异步形式，比如异步通知，如果不是从通讯层开始支持，而单靠流程引擎通过线程也实现的话，意义不大。由mac-rpc来实现更合适。<br/>
<h2><a name="tx"></a>事务处理</h2>
&nbsp;&nbsp;事务处理依赖于应用框架如何实现事务，并不属于流程引擎的功能范畴，mac-flow只提供接口，并不提供默认的实现。这里提供一种基于spring事务管理器的实现<a href="./demo/SimpleTxHandler.java">SimpleTxHandler.java</a>，供大家参考。
<h2><a name="com"></a>创建组件</h2>
&nbsp;&nbsp;选中一个节点，点击右侧面板最下端的“转换为组件”按钮，即可将当前节点转成组件。下次画图时就可以直接从组件库中将此组件拖出使用，不必重复配置。<br/>
&nbsp;&nbsp;注：由于组件的管理相对复杂，提供下载的流程编辑器在修改组件时并不会更新已画好的流程图。
	</div>
</div>
<div id="foot">
Copyright © 2011. All rights reserved&nbsp;&nbsp;蜀ICP备11014774号-1&nbsp;&nbsp;
QQ: 7213571&nbsp;&nbsp;E-mail: pyh_jerry@163.com&nbsp;&nbsp;
<!-- 
<script type="text/javascript">
var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3Ffc0b0282216be3d16055855d8c0e72d9' type='text/javascript'%3E%3C/script%3E"));
</script>
&nbsp;&nbsp;
 -->
</div></body>
</html>
